import { Injectable, Logger } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import { User } from 'src/database/entitys/user.entity';
import { UserService } from 'src/modules/system/user/user.service';
import { EncryptUtil } from 'src/utils/Encrypt.util';

/**
 * 认证服务
 *
 * 这个服务用于处理用户身份验证和授权。
 * 它包含一个用于验证用户身份的方法和一个用于生成JWT的方法。
 */
@Injectable()
export class AuthService {
  constructor(
    private jwtService: JwtService,
    private userService: UserService
  ) {}

  /**
   * 异步验证用户身份。
   * 通过用户名和密码检查用户是否存在并验证密码是否正确。
   *
   * @param username 用户名，用于查找用户。
   * @param password 明文密码，用于验证。
   * @returns 如果验证成功，返回除密码外的用户信息；如果验证失败，返回null。
   */
  async validateUser(username: string, password: string): Promise<any> {
    // 根据用户名查找用户。
    const user = await this.userService.findOne(username);

    // 解密提供的密码。
    // 解密密码
    const decryptPassword = await EncryptUtil.decrypt(password);

    // 检查解密后的密码是否与用户存储的密码哈希值匹配。
    // 这里应该比较密码的哈希值而不是明文密码
    if (user && user.password === decryptPassword) {
      // 如果验证成功，返回用户信息，但排除密码字段。
      // 移除敏感信息，如密码，再返回
      const { password, ...result } = user;
      return result;
    }
    // 如果验证失败，返回null。
    return null;
  }

  /**
   * 用户登录函数
   *
   * @param user 用户对象，包含用户名和用户ID信息。
   * @returns 返回生成的JWT字符串。
   */
  signIn(user: User) {
    // 构建JWT的载荷部分，包含用户名和用户ID
    const payload = { username: user.username, sub: user.userId };
    // 使用JWT服务签发令牌
    return this.jwtService.sign(payload);
  }
}
